package com.niceweather.android.ui.place

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations
import androidx.lifecycle.ViewModel
import com.niceweather.android.logic.dao.Repository
import com.niceweather.android.logic.model.Place

/**
 *
 * Created by callhh on 2020/6/14
 * ViewModel 相当于逻辑层和UI层之间的一个桥梁，虽然会更偏向于逻辑层部分。但是由于ViewModel通常和Activty或Fragment是一一对应的，因此放在一起
 *
 */
class PlaceViewModel : ViewModel() {

    private val searchLiveData = MutableLiveData<String>()

    /**
     * placeList集合用于对界面上显示的城市数据进行缓存
     * 原则上与界面相关的数据都应该放到ViewModel中，这样可以保证它们在手机屏幕发生旋转的时候不会丢失
     */
    val placeList = ArrayList<Place>()

    /**
     * 将传入的搜索参数赋值给了一个searchLiveData对象，并使用Transformations的switchMap()方法来观察这个对象
     *  否者仓库层返回的LiveData对象将无法进行观察。
     *  每当searchPlaces()被调用的时，switchMap()方法所对应的转换函数就会执行。
     *  然后再转换函数中，我们只需要调用仓库层定义的searchPlaces()方法就可以发起网络请求，
     *  同时将仓库层返回的LiveData对象转成一个可供Activity观察的LiveData对象
     *
     */
    val placeLiveData = Transformations.switchMap(searchLiveData){
        query -> Repository.searchPlaces(query)
    }

    fun searchPlaces(query:String){
        searchLiveData.value = query
    }



    //最佳的实现方式是开启一个线程来执行这些比较耗时的任务 然后通过LiveData对象进行数据返回
    //这里只是为了简单写
    fun savePlace(place:Place) = Repository.savePlace(place)

    fun getSavedPlace() = Repository.getSavedPlace()

    fun isPlaceSaved() = Repository.isPlaceSaved()



}